<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>

        // 1. let 和const 
        // let 声明变量，const 声明常量

        /*
            a. 没有预解析，不能够提前使用
            b. 有块级作用域，在{}以外无法访问
            c. 在全局声明但不会挂载在全局
            d. 不能重复声明相同字段
            e. 常量必须赋值，常量不允许修改
        */

        // for (let i = 0; i < 2; i++) {
        //     console.log(i);
        // }
        // console.log(i);

        // 2. 解构赋值
        // 规律：数组解构数组，对象解构对象
        // 要求：数组在解构的时候可以不加声明关键字，但是要加分号（建议还是加声明关键字）;

        /*
            a. 解构出来是变量，需要关键字声明，特别是对象
            b. 解构出来的变量可以进行修改，
                如果是基本数据类型不会影响源数据，
                如果是引用数据类型，则会修改源数据
            c. 解构赋值的内容，可以重定义其他名称，可以给默认值
            d. 函数的形参也可以对实参进行解构赋值
        */

        // 3. 函数的新特性
        // rest 参数(剩余参数),  写在函数的形参上，用于接收剩余的参数；
        // 可以直接接收，也可以接收从第几个开始的剩余，返回值是一个真正的数组

        // 4. 箭头函数
        // () => {}
        /*
            a. 只有匿名函数才可以改造为箭头函数(注册事件，对象的方法)
            b. 形参有且只有一个，可以省略小括号
            c. 语句有且只有一行，可以省略花括号，并且return不能写

            d. 箭头函数不能作为构造器，也不能通过 new 关键字调用
            e. 箭头函数内部没有 arguments 伪数组，使用 rest 参数代替
            f. 箭头函数的内部this指向其书写的环境，也就是外部this指向的对象
        */

        // 5. 扩展运算符
        // Math.max([34, 24, 12, 1, 67, 33, 89])   // NaN
        // Math.max(...[34, 24, 12, 1, 67, 33, 89])   // NaN
        // 用于拷贝或者连接多个数组，用于浅拷贝对象

        // 6. 模板字符串
        //    `<a hef="#">${ num }</a>`

        // 7. 字符串新增特性和数值类型的新增特性
        // padStart padEnd  startsWith  endWith  includes  repeat  toUpperCase  toLowerCase
        // Math.cbrt()   Math.trunc()

        // 大整数是基本数据类型的一种，一般参与超出安全整数的数值计算，会保留精度
        BigInt(40)  // 40n
        var num = 29n;

    </script>
</body>

</html>